package com.boot2.core.mqtt;

import lombok.Data;


/**
* @author zhangweilin
* @date 2018/9/20 11:15 
* @description: 发消息配置
*/
@Data
public class MqttOutboundProperties {

    /**
     * 发消息默认主题
     */
    private String defaultTopic;


    /**
     * 默认false
     */
    private Boolean shouldTrack=false;

    /**
     * 接收消息的质量，可以多个值，一条消息完整的完成，取决于发送者和接收者设定的qos的最小值,
     * 0:最低，不保证收发质量，效率最高
     * 1:保证至少一次，但是如果接收端设置为1,则有可能重复接收，需要手动处理重复值
     * 2:保证收且只收到一条，最消耗资源，2的消耗是0的消耗的100多倍以上
     *
     * 在不设置的情况下，默认为0,传输效率最高，尽量在代码中保证逻辑一致性
     */
    private int defaultQos=0;

    /**
     * 不管clean session的值是什么，当终端设备离线时，QoS=0,1,2的消息一律接收不到。
     * 当clean session的值为true，当终端设备离线再上线时，离线期间发来QoS=0,1,2的消息一律接收不到。
     * 当clean session的值为false，当终端设备离线再上线时，离线期间发来QoS=0,1,2的消息仍然可以接收到。如果同个主题发了多条就接收多条，一条不差，照单全收。
     *
     * 我们来看emqttd服务器程序，客户端每发起一个tcp连接就会新建一个client connection和一次会话，后台会新建一个相应的connection进程和一个session进程。如图1所示，client connection的进程id是<11370.4114.0>。如图2所示，session的进程id是<11370.3126.0>。
     * 如果终端设备离线之后，client connection的进程将销毁。
     * 如果终端设备的clean session的值为true，那么它离线之后，会话将销毁，相应的session进程也会销毁。
     * 如果终端设备的clean session的值为false，那么它离线之后，会话将得以保留，相应的session进程也仍然存在。也就是说，同一topic下，当设备A离线时，设备B在publish消息时，仍然可以匹配topic，进而找到这个session A进程，把消息发给设备A，缓存在消息队列里。设备A上线就可以收到离线消息。
     *
     * 这里设置为true表示每次连接到服务器都以新的身份连接
     */
    private Boolean cleanSession=false;


    /**
     * 关于retain的说明
     * Mnesia：retained_message
     * 终端设备publish消息时，如果retain值是true，则服务器会一直记忆，哪怕是服务器重启。因为Mnesia会本地持久化。
     * 如果服务器接收到终端publish某主题的消息，payload为空且retain值是true，则会删除这条持久化的消息。
     * 如果服务器接收到终端publish某主题的消息，payload为空且retain值是false，则不会删除这条持久化的消息。
     * 是否持久化保留消息,发送时能指定，如果不指定，则采用此值，默认为false
     */
    private Boolean defaultRetained = false;

    /**
     * When {@link #setAsync(boolean)} is true, setting this to true enables
     * publication of {@link MqttMessageSentEvent} and {@link MqttMessageDeliveredEvent}
     * to be emitted. Default false.
     * @param asyncEvents the asyncEvents.
     * @since 4.1
     */
    private Boolean asyncEvents=false;

    /**
     * Set to true if you don't want to block when sending messages. Default false.
     * When true, message sent/delivered events will be published for reception
     * by a suitably configured 'ApplicationListener' or an event
     * inbound-channel-adapter.
     * @param async true for async.
     * @since 4.1
     */
    private Boolean async=true;

    /**
     * Enable message counting statistics
     */
    private Boolean countsEnabled=true;

    /**
     * Use to disable debug logging during normal message flow
     */
    private  Boolean loggingEnabled = true;

    /**
     * Enable all statistics
     */
    private Boolean statsEnabled=true;

    /**
     * 发送超时,默认为30000 ms
     */
    private int completionTimeout=30000;

}
